package pe.gob.sunat.proyecto.aop;

import org.apache.log4j.Logger;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;

import pe.gob.sunat.proyecto.model.Usuario;

@Component
@Aspect
public class LoggingAspect {

	private Logger logger = Logger.getLogger(LoggingAspect.class);

	@Around("pe.gob.sunat.proyecto.aop.Arquitectura.servicePointcut()")
	public Object aroundService(ProceedingJoinPoint pjp) throws Throwable {
		logger.debug("Interceptado around before");
		Object[] args = pjp.getArgs();
		if (args.length == 2 && args[0] instanceof String
				&& args[1] instanceof String) {
			logger.debug(args[0]);
			logger.debug(args[1]);
		}
		Object ret = pjp.proceed(args); // Ejecucion del target
		if (ret instanceof Usuario){
			Usuario usuario = (Usuario)ret;
			logger.debug(usuario.getNombre());
		}
		logger.debug("Interceptado around after");
		return ret;
	}

	@Before("pe.gob.sunat.proyecto.aop.Arquitectura.servicePointcut()")
	public void beforeService() {
		logger.debug("Interceptado beforeService");
	}

	@After("pe.gob.sunat.proyecto.aop.Arquitectura.servicePointcut()")
	public void afterService() {
		logger.debug("Interceptado afterService");
	}

	@Before("pe.gob.sunat.proyecto.aop.Arquitectura.daoPointcut()")
	public void beforeDao() {
		logger.debug("Interceptado beforeDao");
	}

	@After("pe.gob.sunat.proyecto.aop.Arquitectura.daoPointcut()")
	public void afterDao() {
		logger.debug("Interceptado afterDao");
	}

}
